//////////////////////////////////////////////////////////////////////////
#pragma once


//////////////////////////////////////////////////////////////////////////
#include <Core/Core.hpp>
#include "Serializers.hpp"


namespace Config
{
	//////////////////////////////////////////////////////////////////////////
	// Basic typed serializer.
	template< typename Type >
	class TypedItem : public Serializer< Type >
	{
	public:
		// Construction.
		TypedItem( Type& tp, const TypedItem& );
		TypedItem( const std::string& key, Type& tp );

		// Interface members.
		bool					Load( const JSONValue& inv ) override;
		JSONValue*				Save() const override;

	private:
		// Implementation data.
		Type&					mTypeRef;
	};


	//////////////////////////////////////////////////////////////////////////
	template< typename Type >
	TypedItem< Type >::TypedItem( Type& tp, const TypedItem< Type >& rhs )
	:	Serializer< Type >( rhs.Key() )
	,	mTypeRef( tp )
	{
	}


	template< typename Type >
	TypedItem< Type >::TypedItem( const std::string& key, Type& tp )
	:	Serializer< Type >( key )
	,	mTypeRef( tp )
	{
	}


	template< typename Type >
	bool TypedItem< Type >::Load( const JSONValue& inv )
	{
		return Serializer< Type >::_Load( mTypeRef, inv );
	}


	template< typename Type >
	JSONValue* TypedItem< Type >::Save() const
	{
		return Serializer< Type >::_Save( mTypeRef );
	}
}
